package collection;

import java.util.HashSet;

/**
 * HashSet底层机制
 */
@SuppressWarnings("all")
public class HashSetSource {

    public static void main(String[] args) {

        /*
            HashSet 底层是 HashMap
            HashMap 底层是 (数组 + 链表 + 红黑树)
         */

        /*
            添加元素时底层：
            1) 添加一个元素时，先得到hash值，会转成索引值
            2) 找到存储数据表 table。看这个索引位置是否已经存放的有元素
            3) 如果没有，直接加入
            4) 如果有，调用 equals 比较，如果相同就放弃添加。如果不相同，则添加到最后
            5) 在java8中，如果一条链表的元素个数超过 Treeify_threshold(默认8)
               并且table的大小 >= MIN_TREEIRY_CAPACITY(默认64)，就会进行树化(红黑树)
         */
        HashSet hashSet = new HashSet();
        hashSet.add("java");
        hashSet.add("php");
        hashSet.add("java");

        System.out.println("set=" + hashSet);
        /*
            1)执行 HashSet()
                  public HashSet() {
                    map = new HashMap<>();
                  }

            2)执行 add()
                  public boolean add(E e) {//e = "java"
                    return map.put(e, PRESENT)==null;//(static) PRESENT = new Object();
                  }

            3)执行 put() , 该方法会执行 hash(key) 得到key对应的hash值 算法h=key.hashCode())^(h>>>16)
                  public V put(K key, V value) {//key = "java" value = PRESENT 共享
                    return putVal(hash(key), key, value, false, true);
                  }

            4)执行 putVal...
         */
    }
}
